package code.whmmm.util.collection;

import code.whmmm.util.collection.inter.ListPageHandler;

import java.util.ArrayList;
import java.util.List;

/**
 * <p><b>
 * list 工具类
 * </b></p>
 * <br/>
 *
 * @author Zero
 * @date 8/7/2019 4:44 PM
 */
public class ListUtil {

    private ListUtil() {
    }

    /**
     * list 集合 分页
     *
     * @param list     要分页的 list
     * @param pageSize 每页 条数
     * @param <T>      集合 类型
     * @return 将 list 按 page 分组
     */
    public static <T> List<List<T>> splitList(List<T> list, int pageSize) {

        return splitList(list, pageSize, null);
    }

    /**
     * list 集合 分页
     *
     * @param list     要分页的 list
     * @param pageSize 每页 条数
     * @param handler  每页的处理函数
     * @param <T>      集合 类型
     * @return 将 list 按 page 分组
     */
    public static <T> List<List<T>> splitList(List<T> list,
                                              int pageSize,
                                              ListPageHandler<T> handler) {
        List<List<T>> result = new ArrayList<List<T>>();
        if (list == null || list.size() == 0) {
            return result;
        }

        int totalcount = list.size();
        int pagecount = 0;
        int m = totalcount % pageSize;
        if (m > 0) {
            pagecount = totalcount / pageSize + 1;
        } else {
            pagecount = totalcount / pageSize;
        }

        for (int i = 1; i <= pagecount; i++) {
            List<T> subList;
            if (m == 0) {
                subList = list.subList((i - 1) * pageSize, pageSize * (i));

            } else {
                if (i == pagecount) {
                    subList = list.subList((i - 1) * pageSize, totalcount);
                } else {
                    subList = list.subList((i - 1) * pageSize, pageSize * (i));
                }
            }
            if (handler != null) {
                handler.handle(subList);
            }
            result.add(subList);

        }
        return result;
    }
}
